XplentyでSlack Web APIを叩いてチャンネル一覧を取得する
はじめに
データアナリティクス事業本部のkobayashiです。
XplentyはETL、ELTツールとして様々なデータソースを扱え、また処理もXplentyのGUIで直感的に作成できます。 今回はXplentyを使ってAPIを叩いてデータを取得しそのデータをDBに保存してみます。
Xplenty | Simplified ETL & ELT to BigQuery, Snowflake, Redshift & Azure
今回はレスポンスがそれほど複雑でないAPIを使ってみたいと思い色々考えた結果、SlackのAPIからチャンネルのリストを取得してそれをRedshiftへ保存してみたいと思います。クラスメソッドではビジネスチャットツールとしてSlackを利用して活発にやり取りをしていますが、チャンネル数が膨大なのでどんなものがあるかに興味が湧いたのも理由です。
事前準備
Xplentyでジョブを作成する前にSlackのAPIを利用できるようにするためSlackのAppを作成します。 作成方法は他で詳しく説明されているので今回は割愛しますが以下の様な流れになります。
OAuth & Permissions
でScope
を割り当てる- トークンを作成する
なお、今回使用するAPIはチャンネル一覧を取得するconversations.listになります。したがってScope
を割り当てるときはリンク先のページを確認し必要とされるScope
を設定してください。
Xplentyのパッケージの作成
Xplentyのパッケージの中身は大まかに以下になります。
- Slack Web APIにリクエストを送りレスポンスを取得する
- 受け取ったデータを加工してRedshiftへ保存できる形に加工する
- Redshiftへチャンネルテーブルを作成しデータを登録する
これらのコンポーネントを組み合わせてパッケージを作成していきます。
はじめにサイドバーからPackages
を選択してNew Package
を押下し新しいパッケージを作成します。
1.Slack Web API用にREST APIコンポーネントを作成
まずはconversations.list
のAPIを使いチャンネル一覧の情報を取得し、加工・保存を行います。
手順1-1).Add componet
を押下し、SourcesでREST API
を選択する
手順1-2).作成されたアイコンをダブルクリックするとREST APIコンポーネント設定用のモーダルが表示されるので、Authentication
でNone
を選択する。
手順1-3).Request and response
の設定を行いNext
を押下する。
- Method :
POST
を選択 - URL :
https://slack.com/api/conversations.list?token={Slack Web API用のトークン}&types=public_channel
を入力- 本来は
Variables
に変数として格納して?token=$Token
とすれば汎用的に使い回せますが、次のStepでデータが取得できなかったため直書きします。
- 本来は
- Headers
- Key :
Content-Type
を入力 - VALUE :
application/x-www-form-urlencoded
を入力
- Key :
- Body : (空)
- Use Pagination : チェックする
他の設定値はデフォルトのままにします。
Use Pagination
はレスポンスの中にPaginationに該当するものがあれば自動的に次のリクエストを送り全データを取得するオプションです。このオプションを使用しないと全件取得できないので対応しているエンドポイントではチェックすることをお勧めします。対応するエンドポイントはXplentyの公式ドキュメントに記載されているのでご確認ください。
API Endpoints with pagination support – Xplenty Support & Help
手順1-4).Response Schema
へ進み、Available Fieldsでchannels
の右のプラスをクリックしSelected Fields
でchannels
が選択された状態にする。その後Save
を押下し、設定を保存する。
この画面ではレスポンスの内容を確認できるので必要なデータを確認しながら設定を行えます。
これでREST APIコンポーネントの設定は終わりますので、次にデータ加工用のコンポーネントをを設定します。
2.データ加工用のコンポーネント作成
データ加工を行う際には基本的にSelectコンポーネントを使います。その際にソースがデータベースの場合はあまり使わないテクニックですが、REST APIコンポーネントでデータを取得した際にはSelectコンポーネントを2段繋げて使うのがデフォルトになります。
手順2-1).Add componet
を押下し、TransformationsでSelect
を選択する。この操作を2回行い2つSelectコンポーネントを作成する。
手順2-2).作成したSelectコンポーネントを前段のREST APIコンポーネントと接続する。(接続していないとカラムのマッピングができないため)
手順2-3).作成したSelectコンポーネントの1つ目を選択して設定を行いSave
を押下し保存する。
- EXPRESSION :
Flatten(channels)
を入力 - ALIAS :
channel
を入力
Xplentyには関数が用意されていてこれらを使うことで前のコンポーネントから渡ってきた値を加工することができます。 その中でもREST APIコンポーネントでデータを取得した際はまずはFlattenでデータをフラット化することが定番処理になります。
Xplenty Functions – Xplenty Support & Help
手順2-4).作成したSelectコンポーネントの2つ目を選択して設定を行いSave
を押下し保存する。
- EXPRESSION、ALIASに以下のように入力
EXPRESSION | ALIAS |
---|---|
JsonStringToMap(channel)#'id' | id |
JsonStringToMap(channel)#'name' | name |
JsonStringToMap(channel)#'name_normalized' | name_normalized |
JsonStringToMap(channel)#'creator' | creator |
ToDate(ParseLongOrDefault(JsonStringToMap(channel)#'created',0)*1000) | created |
JsonStringToMap(JsonStringToMap(channel)#'topic')#'value' | topic_value |
JsonStringToMap(JsonStringToMap(channel)#'topic')#'creator' | topic_creator |
ToDate(ParseLongOrDefault(JsonStringToMap(JsonStringToMap(channel)#'topic')#'last_set',0)*1000) | topic_lastset |
JsonStringToMap(JsonStringToMap(channel)#'purpose')#'value' | purpose_value |
JsonStringToMap(JsonStringToMap(channel)#'purpose')#'creator' | purpose_creator |
ToDate(ParseLongOrDefault(JsonStringToMap(JsonStringToMap(channel)#'purpose')#'last_set',0)*1000) | purpose_lastset |
このステップでデータをRedshiftへ格納したい形に加工しています。Flattenを使うとその中身はJson文字列で返ってくるのでJson文字列を扱う関数を使用します。
- JsonStringToMap : Json文字列をMap型へ変換する
- ParseLongOrDefault : 数値の文字列をLong型へ変換する
- ToDate : 入力をいい感じに日付型へ変換する
これでRedshiftへ保存する形へデータを変換できましたので、最後にRedshiftへ保存する設定をします。
3.保存先としてRedshiftコンポーネント作成
ここまで加工したデータを保存するためDestinationsでRedshiftコンポーネントを作成・設定します。簡単に行うためテーブルは予め作成せずXplentyのジョブで自動作成し、データは毎回洗い替えを行う設定にします。
手順3-1).Add componet
を押下し、DestinationsでAmazon Redshift
を選択する
手順3-2).画面上にRedshiftのアイコンが作成されるので先に作成したSelectコンポーネントのアイコンとDrag&Dropで紐付ける。
手順3-3).RedshiftのアイコンをダブルクリックするとRedshiftコンポーネント設定用のモーダルが表示されるので、設定済みのRedshiftのconnectionを選択する。
手順3-4).移行先のRedshiftのスキーマとテーブルを入力し各種設定を行い、Next
を押下する。
- Automatically create table if it doesn't exist : チェックする
- Automatically add missing columns : チェックする
- Operation type :
Overwrite (Truncate and insert)
を選択する
他の設定はデフォルトで問題ありません。
手順3-5).移行元と移行先のカラムマッピングを行う。移行先のテーブルは新規作成なのでAuto fill
を押下して自動設定を行う。
手順3-6).右下のSave
を押下して設定を保存する。
Xplentyのパッケージの実行と確認
ここまで設定すると以下の様なパッケージになっていると思います。あとはこれを実行して結果を確認してみます。
手順4).Save & Run job
を押下しジョブを実行する。
Redshitでデータを確認
select id,name,created,topic_value from cm_kobayashi_test.sl_conversations;
id | name | topic_value | purpose_value |
---|---|---|---|
C03SX1P0K | 00-announcement | :star: 全社共有部屋(全員参加) :star: ・全社アナウンス専用 |
This channel is used for announcement to the entire classmethod gro ... |
CLZ49APGB | times-kobayashi-m | DA部小林の分報 | つれづれ無いことを書いていく |
CFBKTUMUM | misc-angular | angularに関することあれこれ | NULL |
CEARDN84Q | rss-aws-blogs | NULL | NULL |
CELU9SE68 | misc-github | :octocat:GitHub に関する情報共有, 雑談をしよう:octocat: | NULL |
CEN56R6B1 | misc-container | :docker:コンテナ周辺技術に関する情報共有, 雑談をしよう:docker: | NULL |
CEXMSGE5B | misc-子育て | NULL | NULL |
こんな感じでなんと2132件もデータが取れました。
まとめ
XplentyのREST APIコンポーネントを使ってSlack Web APIからデータを取得してみました。Slack Web APIのレスポンスはそれほどネストしているわけでもなく扱いやすいデータでしたので手間なく取り込めました。次回はもう少し複雑なレスポンスを記事にまとめたいと思います。
最後まで読んで頂いてありがとうございました。